# RVC Controller SW — Sequence Diagrams (Design Level)

| 항목 | 내용 |
|------|------|
| 문서 번호 | RVC-SD-002 |
| 버전 | v2.0 |
| 작성일 | 2026-05-29 |
| 작성자 | OOAD Team 9 |
| 상태 | 초안 (Draft) |

---

## 변경 이력 (Change History)

| 버전 | 날짜 | 변경 내용 | 작성자 |
|------|------|-----------|--------|
| v1.0 | 2026-05-19 | 최초 작성 — Class Diagram 기반 Design-level SD 8개 도출 | OOAD Team 9 |
| v1.2 | 2026-05-19 | Sensor Actor (HW) suffix 통일 및 RVC System Actor 내부화 | OOAD Team 9 |
| v2.0 | 2026-05-29 | HW 변경 반영 — 우측 장애물 센서 제거. SD-03·04·05 변경 | OOAD Team 9 |

---

## 개요

Design-level Sequence Diagram은 시스템 내부 **객체 간 메시지 흐름**을 표현한다.

| 구분 | SSD | Sequence Diagram (Design) |
|------|-----|--------------------------|
| 시스템 표현 | 블랙박스 | 내부 객체 분해 |
| 참여자 | 외부 Actor + 시스템 경계 | Actor + SW 클래스 인스턴스 |
| 목적 | 시스템 오퍼레이션 도출 | 메서드 할당 및 협력 설계 |

HW 물리 센서만 외부 Actor로 정의한다. RVC System은 SW 참여자(`:RVC`)로 표현하며, Controller 내부에서 시작되는 시나리오(SD-03/05/07)는 self-call로 표현한다.

---

## v1 → v2 변경 요약 (Change Summary)

| SD | 변경 구분 | 변경 내용 |
|----|-----------|-----------|
| SD-01 | — | 변경 없음 |
| SD-02 | — | 변경 없음 |
| SD-03 | **[변경]** | `right:ObstacleSensor` 삭제, `front:ObstacleSensor` 추가, 방향 결정 2단계 로직으로 변경 |
| SD-04 | **[변경]** | `right:ObstacleSensor` 참여자 삭제, `detect()` + `reportObstacle(RIGHT)` 삭제 |
| SD-05 | **[변경]** | `turn(BACK)` 삭제, `left:ObstacleSensor` + `front:ObstacleSensor` 추가, 방향 재판단 로직 추가 |
| SD-06 | — | 변경 없음 |
| SD-07 | — | 변경 없음 |
| SD-08 | — | 변경 없음 |

---

## SD 목록

| SD ID | 대응 UC | 시작점 | 주요 SW 참여 객체 | 변경 구분 |
|-------|---------|--------|-----------------|-----------|
| SD-01 | UC-01 | :RVC | :RVC, :Controller, :MovementUnit, :CleaningUnit, front:ObstacleSensor, dust:DustSensor | — |
| SD-02 | UC-02 | Obstacle Sensor (HW) | front:ObstacleSensor, :Controller | — |
| SD-03 | UC-03 | :Controller self-call | :Controller, :MovementUnit, left:ObstacleSensor, ~~right:ObstacleSensor~~ → **front:ObstacleSensor** | **[변경]** |
| SD-04 | UC-04 | Obstacle Sensor (HW) | left:ObstacleSensor, ~~right:ObstacleSensor~~, :Controller | **[변경]** |
| SD-05 | UC-05 | :Controller self-call | :Controller, :MovementUnit, **left:ObstacleSensor**, **front:ObstacleSensor** | **[변경]** |
| SD-06 | UC-06 | Dust Sensor (HW) | dust:DustSensor, :Controller | — |
| SD-07 | UC-07 | :Controller self-call | :Controller, :CleaningUnit | — |
| SD-08 | UC-08 | Sensor (HW) | :Sensor, :Controller, :MovementUnit | — |

---

## SD-01 : UC-01 Perform Normal Cleaning

> **시작점:** :RVC (SW participant) — startCleaning() 호출  
> **변경 구분:** —  
> **설명:** RVC 시작 후 정상 청소 루프 — 이벤트 없는 기본 흐름

![SD-01](diagrams/sd_01.png)

---

## SD-02 : UC-02 Detect Obstacle (Front)

> **Actor:** Obstacle Sensor (HW) → front:ObstacleSensor (SW)  
> **변경 구분:** —  
> **설명:** 물리 전방 센서가 장애물을 감지하여 SW 클래스가 Controller에 보고

![SD-02](diagrams/sd_02.png)

---

## SD-03 : UC-03 Avoid Front Obstacle

> **시작점:** :Controller self-call — pollSensors() 중 장애물 감지 시 내부 호출  
> **변경 구분:** **[변경]**  
> **설명:** 전방 장애물 확인 후 정지 → 좌측 확인 → 좌측 여유 시 좌회전 / 좌측 막힘 시 우회전+전방 센서로 우측 확인 → 전진 재개

**v1 → v2 변경 상세:**

| 항목 | v1 | v2 | 변경 구분 |
|------|----|----|-----------|
| 참여자 | `right:ObstacleSensor` | 삭제 | **[삭제]** |
| 참여자 | (없음) | `front:ObstacleSensor` (우측 간접 감지 용도) | **[추가]** |
| 측면 확인 | `CTR->>LS: isObstacleDetected()` + `CTR->>RS: isObstacleDetected()` (동시) | `CTR->>LS: isObstacleDetected()` 먼저, 막히면 `turn(RIGHT)` + `CTR->>FS: isObstacleDetected()` | **[변경]** |
| 분기 조건 | `LEFT or RIGHT free` (단일 alt) | ① `LEFT free` → 좌회전 ② `LEFT blocked` → `turn(RIGHT)` + `FS` 확인 → 분기 (2단계 alt) | **[변경]** |

![SD-03](diagrams/sd_03.png)

---

## SD-04 : UC-04 Detect Side Obstacles

> **Actor:** Obstacle Sensor (HW) → left:ObstacleSensor (SW)  
> **변경 구분:** **[변경]**  
> **설명:** 좌측 물리 센서가 장애물을 감지하여 Controller에 보고. 우측 HW 센서 제거로 관련 흐름 삭제

**v1 → v2 변경 상세:**

| 항목 | v1 | v2 | 변경 구분 |
|------|----|----|-----------|
| 참여자 | `right:ObstacleSensor` (RS) | 삭제 | **[삭제]** |
| 메시지 | `OS->>RS: detect()` | 삭제 | **[삭제]** |
| 메시지 | `RS->>CTR: reportObstacle(RIGHT)` | 삭제 | **[삭제]** |
| 메시지 | `CTR->>CTR: recordObstacleDetection(RIGHT)` | 삭제 | **[삭제]** |
| 메시지 | `CTR-->>RS: ack()` | 삭제 | **[삭제]** |

![SD-04](diagrams/sd_04.png)

---

## SD-05 : UC-05 Avoid All-Direction Obstacle

> **시작점:** :Controller self-call — avoidFrontObstacle() 내 양측 막힘 시 내부 호출  
> **변경 구분:** **[변경]**  
> **설명:** 전·좌·우 모두 막힌 경우 후진 → 좌측 재확인 → 좌회전 또는 우회전(+전방 센서 확인) → 전진 재개

**v1 → v2 변경 상세:**

| 항목 | v1 | v2 | 변경 구분 |
|------|----|----|-----------|
| 참여자 | (없음) | `left:ObstacleSensor` | **[추가]** |
| 참여자 | (없음) | `front:ObstacleSensor` | **[추가]** |
| 후진 후 회전 | `CTR->>MU: turn(freeDirection)` (BACK 포함) | 삭제 | **[삭제]** |
| 방향 재판단 | (없음) | `CTR->>LS: isObstacleDetected()` + alt: LEFT free → `turn(LEFT)` / LEFT blocked → `turn(RIGHT)` + `CTR->>FS: isObstacleDetected()` | **[추가]** |

![SD-05](diagrams/sd_05.png)

---

## SD-06 : UC-06 Detect Dust

> **Actor:** Dust Sensor (HW) → dust:DustSensor (SW)  
> **변경 구분:** —  
> **설명:** 물리 먼지 센서가 먼지를 감지하여 Controller에 보고

![SD-06](diagrams/sd_06.png)

---

## SD-07 : UC-07 Boost Cleaning Power

> **시작점:** :Controller self-call — recordDustDetection() 후 내부 호출  
> **변경 구분:** —  
> **설명:** 먼지 감지 후 청소 파워 증가 → boostDuration 경과 후 복귀

![SD-07](diagrams/sd_07.png)

---

## SD-08 : UC-08 Handle Sensor Error

> **Actor:** Sensor (HW) → :Sensor (SW)  
> **변경 구분:** —  
> **설명:** 물리 센서 오류 → SW 클래스가 Controller에 보고 → 유효성 검사 → 유지 또는 정지

![SD-08](diagrams/sd_08.png)

---

## 메서드 할당 요약 (Method Assignment)

| 클래스 | 메서드 | 관련 SD | 변경 구분 |
|--------|--------|---------|-----------|
| Controller | `startCleaning()` | SD-01 | — |
| Controller | `pollSensors()` | SD-01 | — |
| Controller | `recordObstacleDetection(position)` | SD-02, SD-04 | — |
| Controller | `avoidFrontObstacle()` | SD-03 | **[변경]** |
| Controller | `checkSideObstacles()` | SD-03 | **[변경]** |
| Controller | `avoidAllDirectionObstacle()` | SD-05 | **[변경]** |
| Controller | `recordDustDetection(dustLevel)` | SD-06 | — |
| Controller | `boostCleaningPower()` | SD-07 | — |
| Controller | `validateSensorData(sensorId)` | SD-08 | — |
| Controller | `retainLastValidState()` | SD-08 | — |
| MovementUnit | `stop()` / `moveForward()` / `moveBackward()` / `turn(direction)` | SD-03, SD-05 | — |
| CleaningUnit | `startCleaning()` / `boostPower()` / `restoreNormalPower()` | SD-01, SD-07 | — |
| ObstacleSensor | `readData()` / `isObstacleDetected()` / `reportObstacle(position)` | SD-01~04 | **[변경]** |
| DustSensor | `readData()` / `reportDust(dustLevel)` | SD-01, SD-06 | — |

> **[변경] ObstacleSensor 관련:**  
> v1에서는 `right:ObstacleSensor` 인스턴스가 SD-03·04에 참여하였다.  
> v2에서는 `right:ObstacleSensor` 인스턴스가 제거되고, 우측 방향 확인은 `front:ObstacleSensor`가 `turn(RIGHT)` 기동 후 재활용된다.  
> `front:ObstacleSensor`의 `isObstacleDetected()` 호출이 SD-03·05에 **추가**된다.
